source('../settings/settings.R')
source('commonFunctions.R')
drive1 <- read.csv('../data/processed/analysis/TT1_Drive_1_PP.csv')
drive2 <- read.csv('../data/processed/Analysis/TT1_Drive_2_PP.csv')
drive3 <- read.csv('../data/processed/Analysis/TT1_Drive_3_PP.csv')
drive4 <- read.csv('../data/processed/Analysis/TT1_Drive_4_PP.csv', stringsAsFactors = T)
set.seed(43)
combinedDf <- cbind(drive4,
drive1$MeanPP_Seg0,
drive2$MeanPP_SegMax, drive3$MeanPP_SegMax,
drive2$MeanPP_Seg0, drive3$MeanPP_Seg0,
drive2$StdPP, drive3$StdPP
)
names(combinedDf) <- c(names(drive4),
"PP_Dev_1_Turning",
"PP_Dev_2_Straight", "PP_Dev_3_Straight",
"PP_Dev_2_Turning", "PP_Dev_3_Turning",
"Std_PP_2", "Std_PP_3")
combinedDf$Subject <- paste0("#", str_pad(combinedDf$Subject, 2, pad="0"))
combinedDf_NoStressor <- combinedDf[combinedDf$Activity == "NO",]
combinedDf_Cognitive <- combinedDf[combinedDf$Activity == "C",]
combinedDf_Motoric <- combinedDf[combinedDf$Activity == "M",]
combinedDf_NoStressor$Subject <- as.factor(combinedDf_NoStressor$Subject)
combinedDf_Cognitive$Subject <- as.factor(combinedDf_Cognitive$Subject)
combinedDf_Motoric$Subject <- as.factor(combinedDf_Motoric$Subject)
COLOR_NORMAL <- list(color='rgb(120,120,120)')
COLOR_COGNITIVE <- list(color='rgb(158,202,225)')
COLOR_MOTORIC <- list(color='rgb(58,200,225)')
COLOR_FAILURE <- list(color='red')
yAxis <- list(
title = 'Perinasal Perspiration (Log)',
range=c(-0.3, 0.5)
)
THRESHOLD_MILD = 0.07
THRESHOLD_EXTREME = 0.2
MARKER_LINE_MILD = list(color="blue")
MARKER_LINE_EXTREME = list(color="red")
fig_NoStressor <- plot_ly(combinedDf_NoStressor, x = ~Subject, y = ~PP_Dev_2_Straight, type = 'bar', name = 'Cognitive - Mean PP (Straight)', marker=COLOR_COGNITIVE) %>%
add_trace(y = ~PP_Dev_3_Straight, name = 'Motoric - Mean PP (Straight)', marker=COLOR_MOTORIC) %>%
add_trace(y = ~PP_Dev_2_Turning, name = 'Cognitive - Mean PP (Turning)', marker=COLOR_COGNITIVE) %>%
add_trace(y = ~PP_Dev_3_Turning, name = 'Motoric - Mean PP (Turning)', marker=COLOR_MOTORIC) %>%
add_trace(y = ~PP_Dev, name = 'Failure - PP Deviation', marker=COLOR_FAILURE) %>%
add_segments(x="#01", xend="#41", y = THRESHOLD_MILD, yend = THRESHOLD_MILD, name="Threshold: Mild Change of PP",
line=list(color="blue", dash = 'dot')) %>%
# add_segments(x="#01", xend="#41", y = THRESHOLD_EXTREME, yend = THRESHOLD_EXTREME, name="Threshold: Extreme Change of PP",
# line=list(color="darkred", dash = 'dot')) %>%
layout(yaxis = yAxis, barmode = 'group', title="Failure Driving \n Group=No Stressor")
htmltools::tagList(fig_NoStressor)
A marker object has been specified, but markers is not in the mode
Adding markers to the mode...
A marker object has been specified, but markers is not in the mode
Adding markers to the mode...
fig_Cognitive <- plot_ly(combinedDf_Cognitive, x = ~Subject, y = ~PP_Dev_2_Straight, type = 'bar', name = 'Cognitive - Mean PP (Straight)', marker=COLOR_COGNITIVE) %>%
add_trace(y = ~PP_Dev_3_Straight, name = 'Motoric - Mean PP (Straight)', marker=COLOR_MOTORIC) %>%
add_trace(y = ~PP_Dev_2_Turning, name = 'Cognitive - Mean PP (Turning)', marker=COLOR_COGNITIVE) %>%
add_trace(y = ~PP_Dev_3_Turning, name = 'Motoric - Mean PP (Turning)', marker=COLOR_MOTORIC) %>%
add_trace(y = ~PP_Dev, name = 'Failure - PP Deviation', marker=COLOR_FAILURE) %>%
add_segments(x="#02", xend="#22", y = THRESHOLD_MILD, yend = THRESHOLD_MILD, name="Threshold: Mild Change of PP",
line=list(color="blue", dash = 'dot')) %>%
# add_segments(x="#02", xend="#22", y = THRESHOLD_EXTREME, yend = THRESHOLD_EXTREME, name="Threshold: Extreme Change of PP",
# line=list(color="darkred", dash = 'dot')) %>%
layout(yaxis = yAxis, barmode = 'group', title="Failure Driving \n Group=Cognitive")
htmltools::tagList(fig_Cognitive)
A marker object has been specified, but markers is not in the mode
Adding markers to the mode...
A marker object has been specified, but markers is not in the mode
Adding markers to the mode...
fig_Motoric <- plot_ly(combinedDf_Motoric, x = ~Subject, y = ~PP_Dev_2_Straight, type = 'bar', name = 'Cognitive - Mean PP (Straight)', marker=COLOR_COGNITIVE) %>%
add_trace(y = ~PP_Dev_3_Straight, name = 'Motoric - Mean PP (Straight)', marker=COLOR_MOTORIC) %>%
add_trace(y = ~PP_Dev_2_Turning, name = 'Cognitive - Mean PP (Turning)', marker=COLOR_COGNITIVE) %>%
add_trace(y = ~PP_Dev_3_Turning, name = 'Motoric - Mean PP (Turning)', marker=COLOR_MOTORIC) %>%
add_trace(y = ~PP_Dev, name = 'Failure - PP Deviation', marker=COLOR_FAILURE) %>%
add_segments(x="#05", xend="#31", y = THRESHOLD_MILD, yend = THRESHOLD_MILD, name="Threshold: Mild Change of PP",
line=list(color="blue", dash = 'dot')) %>%
# add_segments(x="#05", xend="#31", y = THRESHOLD_EXTREME, yend = THRESHOLD_EXTREME, name="Threshold: Extreme Change of PP",
# line=list(color="darkred", dash = 'dot')) %>%
layout(yaxis = yAxis, barmode = 'group', title="Failure Driving \n Group: Motoric")
htmltools::tagList(fig_Motoric)
A marker object has been specified, but markers is not in the mode
Adding markers to the mode...
A marker object has been specified, but markers is not in the mode
Adding markers to the mode...
library(nlme)
combinedDf$Subject = as.factor(combinedDf$Subject)
combinedDf$Activity = as.factor(combinedDf$Activity)
combinedDf$PP_Dev_Group = ifelse(combinedDf$PP_Dev > THRESHOLD_MILD, 1, 0)
model = lme(PP_Dev ~
abs(PP_Dev_2_Straight)
+ abs(PP_Dev_3_Straight)
+ abs(PP_Dev_2_Turning)
+ abs(PP_Dev_3_Turning)
+ factor(Activity),
random=~1|Subject,
data=combinedDf,
method="REML")
# anova(model)
summary(model)
Linear mixed-effects model fit by REML
Data: combinedDf
Random effects:
Formula: ~1 | Subject
(Intercept) Residual
StdDev: 0.06029036 0.02260888
Fixed effects: PP_Dev ~ abs(PP_Dev_2_Straight) + abs(PP_Dev_3_Straight) + abs(PP_Dev_2_Turning) + abs(PP_Dev_3_Turning) + factor(Activity)
Correlation:
(Intr) a(PP_D_2_S a(PP_D_3_S a(PP_D_2_T a(PP_D_3_T fc(A)M
abs(PP_Dev_2_Straight) 0.627
abs(PP_Dev_3_Straight) 0.041 0.045
abs(PP_Dev_2_Turning) -0.509 -0.788 -0.427
abs(PP_Dev_3_Turning) -0.561 -0.477 -0.717 0.525
factor(Activity)M -0.487 -0.222 0.303 -0.084 -0.024
factor(Activity)NO -0.257 -0.044 0.547 -0.313 -0.341 0.600
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-0.46048178 -0.28553137 0.03655763 0.12903557 0.67575137
Number of Observations: 21
Number of Groups: 21
plot(model)

combinedDf$PP_Dev <- NULL
combinedDf$Subject <- NULL
combinedDf$Activity_NO <- ifelse(combinedDf$Activity == "NO", 1, 0)
combinedDf$Activity_C <- ifelse(combinedDf$Activity == "C", 1, 0)
combinedDf$Activity_M <- ifelse(combinedDf$Activity == "M", 1, 0)
combinedDf$Activity <- NULL
combinedDf$Class <- ifelse(combinedDf$PP_Dev_Group == 1, T, F)
combinedDf$PP_Dev_Group <- NULL
# library(mefa)
# combinedDf <- rep(combinedDf, 10)
n_folds <- 3
params <- param <- list(objective = "binary:logistic",
booster = "gbtree",
eval_metric = "auc",
eta = 0.1,
max_depth = 8,
alpha = 1,
lambda = 0,
gamma = 0.3,
min_child_weight = 0.3,
subsample = 1,
colsample_bytree = 0.5)
# XGBoost Model
xgb_m <- xgb.cv( params = param,
data = as.matrix(combinedDf %>% select(-Class)) ,
label = combinedDf$Class,
nrounds = 500,
verbose = F,
prediction = T,
maximize = T,
nfold = n_folds,
metrics = c("auc", "error"),
early_stopping_rounds = 100,
stratified = F,
scale_pos_weight = 3.05)
# xgb_m$evaluation_log[xgb_m$best_iteration,"test_auc_mean"]
xgb_m$evaluation_log[xgb_m$best_iteration,]
NA
library(pROC)
# it = which.max(xgb_m$evaluation_log$test_auc_mean)
# best.iter = xgb_m$evaluation_log$iter[it]
# best.iter
plot(pROC::roc(response = ifelse(combinedDf$Class==T, 1, 0),
predictor = xgb_m$pred,
levels=c(0, 1)),
lwd=1.5)
Setting direction: controls < cases

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnNvdXJjZSgnLi4vc2V0dGluZ3Mvc2V0dGluZ3MuUicpCnNvdXJjZSgnY29tbW9uRnVuY3Rpb25zLlInKQpgYGAKCmBgYHtyfQpkcml2ZTEgPC0gcmVhZC5jc3YoJy4uL2RhdGEvcHJvY2Vzc2VkL2FuYWx5c2lzL1RUMV9Ecml2ZV8xX1BQLmNzdicpCmRyaXZlMiA8LSByZWFkLmNzdignLi4vZGF0YS9wcm9jZXNzZWQvQW5hbHlzaXMvVFQxX0RyaXZlXzJfUFAuY3N2JykKZHJpdmUzIDwtIHJlYWQuY3N2KCcuLi9kYXRhL3Byb2Nlc3NlZC9BbmFseXNpcy9UVDFfRHJpdmVfM19QUC5jc3YnKQpkcml2ZTQgPC0gcmVhZC5jc3YoJy4uL2RhdGEvcHJvY2Vzc2VkL0FuYWx5c2lzL1RUMV9Ecml2ZV80X1BQLmNzdicsIHN0cmluZ3NBc0ZhY3RvcnMgPSBUKQpgYGAKCmBgYHtyfQpzZXQuc2VlZCg0MykKY29tYmluZWREZiA8LSBjYmluZChkcml2ZTQsIAogICAgICAgICAgICAgICAgICAgIGRyaXZlMSRNZWFuUFBfU2VnMCwgCiAgICAgICAgICAgICAgICAgICAgZHJpdmUyJE1lYW5QUF9TZWdNYXgsIGRyaXZlMyRNZWFuUFBfU2VnTWF4LCAKICAgICAgICAgICAgICAgICAgICBkcml2ZTIkTWVhblBQX1NlZzAsIGRyaXZlMyRNZWFuUFBfU2VnMCwKICAgICAgICAgICAgICAgICAgICBkcml2ZTIkU3RkUFAsIGRyaXZlMyRTdGRQUCAKICAgICAgICAgICAgICAgICAgKQpuYW1lcyhjb21iaW5lZERmKSA8LSBjKG5hbWVzKGRyaXZlNCksIAogICAgICAgICAgICAgICAgICAgICAgICJQUF9EZXZfMV9UdXJuaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAiUFBfRGV2XzJfU3RyYWlnaHQiLCAiUFBfRGV2XzNfU3RyYWlnaHQiLCAKICAgICAgICAgICAgICAgICAgICAgICAiUFBfRGV2XzJfVHVybmluZyIsICJQUF9EZXZfM19UdXJuaW5nIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIlN0ZF9QUF8yIiwgIlN0ZF9QUF8zIikKCmNvbWJpbmVkRGYkU3ViamVjdCA8LSBwYXN0ZTAoIiMiLCBzdHJfcGFkKGNvbWJpbmVkRGYkU3ViamVjdCwgMiwgcGFkPSIwIikpCmBgYAoKYGBge3J9CmNvbWJpbmVkRGZfTm9TdHJlc3NvciA8LSBjb21iaW5lZERmW2NvbWJpbmVkRGYkQWN0aXZpdHkgPT0gIk5PIixdCmNvbWJpbmVkRGZfQ29nbml0aXZlIDwtIGNvbWJpbmVkRGZbY29tYmluZWREZiRBY3Rpdml0eSA9PSAiQyIsXQpjb21iaW5lZERmX01vdG9yaWMgPC0gY29tYmluZWREZltjb21iaW5lZERmJEFjdGl2aXR5ID09ICJNIixdCgpjb21iaW5lZERmX05vU3RyZXNzb3IkU3ViamVjdCA8LSBhcy5mYWN0b3IoY29tYmluZWREZl9Ob1N0cmVzc29yJFN1YmplY3QpCmNvbWJpbmVkRGZfQ29nbml0aXZlJFN1YmplY3QgPC0gYXMuZmFjdG9yKGNvbWJpbmVkRGZfQ29nbml0aXZlJFN1YmplY3QpCmNvbWJpbmVkRGZfTW90b3JpYyRTdWJqZWN0IDwtIGFzLmZhY3Rvcihjb21iaW5lZERmX01vdG9yaWMkU3ViamVjdCkKYGBgCgpgYGB7cn0KQ09MT1JfTk9STUFMIDwtIGxpc3QoY29sb3I9J3JnYigxMjAsMTIwLDEyMCknKQpDT0xPUl9DT0dOSVRJVkUgPC0gbGlzdChjb2xvcj0ncmdiKDE1OCwyMDIsMjI1KScpCkNPTE9SX01PVE9SSUMgPC0gbGlzdChjb2xvcj0ncmdiKDU4LDIwMCwyMjUpJykKQ09MT1JfRkFJTFVSRSA8LSBsaXN0KGNvbG9yPSdyZWQnKQoKeUF4aXMgPC0gbGlzdCgKICB0aXRsZSA9ICdQZXJpbmFzYWwgUGVyc3BpcmF0aW9uIChMb2cpJywKICByYW5nZT1jKC0wLjMsIDAuNSkKKQoKVEhSRVNIT0xEX01JTEQgPSAwLjA3ClRIUkVTSE9MRF9FWFRSRU1FID0gMC4yCgpNQVJLRVJfTElORV9NSUxEID0gbGlzdChjb2xvcj0iYmx1ZSIpCk1BUktFUl9MSU5FX0VYVFJFTUUgPSBsaXN0KGNvbG9yPSJyZWQiKQpgYGAKCmBgYHtyLCB3YXJuaW5nPUZ9CmZpZ19Ob1N0cmVzc29yIDwtIHBsb3RfbHkoY29tYmluZWREZl9Ob1N0cmVzc29yLCB4ID0gflN1YmplY3QsIHkgPSB+UFBfRGV2XzJfU3RyYWlnaHQsIHR5cGUgPSAnYmFyJywgbmFtZSA9ICdDb2duaXRpdmUgLSBNZWFuIFBQIChTdHJhaWdodCknLCBtYXJrZXI9Q09MT1JfQ09HTklUSVZFKSAlPiUKICBhZGRfdHJhY2UoeSA9IH5QUF9EZXZfM19TdHJhaWdodCwgbmFtZSA9ICdNb3RvcmljIC0gTWVhbiBQUCAoU3RyYWlnaHQpJywgbWFya2VyPUNPTE9SX01PVE9SSUMpICU+JSAKICBhZGRfdHJhY2UoeSA9IH5QUF9EZXZfMl9UdXJuaW5nLCBuYW1lID0gJ0NvZ25pdGl2ZSAtIE1lYW4gUFAgKFR1cm5pbmcpJywgbWFya2VyPUNPTE9SX0NPR05JVElWRSkgJT4lIAogIGFkZF90cmFjZSh5ID0gflBQX0Rldl8zX1R1cm5pbmcsIG5hbWUgPSAnTW90b3JpYyAtIE1lYW4gUFAgKFR1cm5pbmcpJywgbWFya2VyPUNPTE9SX01PVE9SSUMpICU+JSAKICBhZGRfdHJhY2UoeSA9IH5QUF9EZXYsIG5hbWUgPSAnRmFpbHVyZSAtIFBQIERldmlhdGlvbicsIG1hcmtlcj1DT0xPUl9GQUlMVVJFKSAlPiUgCiAgYWRkX3NlZ21lbnRzKHg9IiMwMSIsIHhlbmQ9IiM0MSIsIHkgPSBUSFJFU0hPTERfTUlMRCwgeWVuZCA9IFRIUkVTSE9MRF9NSUxELCBuYW1lPSJUaHJlc2hvbGQ6IE1pbGQgQ2hhbmdlIG9mIFBQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJibHVlIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgIyBhZGRfc2VnbWVudHMoeD0iIzAxIiwgeGVuZD0iIzQxIiwgeSA9IFRIUkVTSE9MRF9FWFRSRU1FLCB5ZW5kID0gVEhSRVNIT0xEX0VYVFJFTUUsIG5hbWU9IlRocmVzaG9sZDogRXh0cmVtZSBDaGFuZ2Ugb2YgUFAiLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iZGFya3JlZCIsIGRhc2ggPSAnZG90JykpICU+JQogIGxheW91dCh5YXhpcyA9IHlBeGlzLCBiYXJtb2RlID0gJ2dyb3VwJywgdGl0bGU9IkZhaWx1cmUgRHJpdmluZyBcbiBHcm91cD1ObyBTdHJlc3NvciIpCgpodG1sdG9vbHM6OnRhZ0xpc3QoZmlnX05vU3RyZXNzb3IpCmBgYAoKYGBge3IsIHdhcm5pbmc9Rn0KZmlnX0NvZ25pdGl2ZSA8LSBwbG90X2x5KGNvbWJpbmVkRGZfQ29nbml0aXZlLCB4ID0gflN1YmplY3QsIHkgPSB+UFBfRGV2XzJfU3RyYWlnaHQsIHR5cGUgPSAnYmFyJywgbmFtZSA9ICdDb2duaXRpdmUgLSBNZWFuIFBQIChTdHJhaWdodCknLCBtYXJrZXI9Q09MT1JfQ09HTklUSVZFKSAlPiUKICBhZGRfdHJhY2UoeSA9IH5QUF9EZXZfM19TdHJhaWdodCwgbmFtZSA9ICdNb3RvcmljIC0gTWVhbiBQUCAoU3RyYWlnaHQpJywgbWFya2VyPUNPTE9SX01PVE9SSUMpICU+JSAKICBhZGRfdHJhY2UoeSA9IH5QUF9EZXZfMl9UdXJuaW5nLCBuYW1lID0gJ0NvZ25pdGl2ZSAtIE1lYW4gUFAgKFR1cm5pbmcpJywgbWFya2VyPUNPTE9SX0NPR05JVElWRSkgJT4lIAogIGFkZF90cmFjZSh5ID0gflBQX0Rldl8zX1R1cm5pbmcsIG5hbWUgPSAnTW90b3JpYyAtIE1lYW4gUFAgKFR1cm5pbmcpJywgbWFya2VyPUNPTE9SX01PVE9SSUMpICU+JSAKICBhZGRfdHJhY2UoeSA9IH5QUF9EZXYsIG5hbWUgPSAnRmFpbHVyZSAtIFBQIERldmlhdGlvbicsIG1hcmtlcj1DT0xPUl9GQUlMVVJFKSAlPiUgCiAgYWRkX3NlZ21lbnRzKHg9IiMwMiIsIHhlbmQ9IiMyMiIsIHkgPSBUSFJFU0hPTERfTUlMRCwgeWVuZCA9IFRIUkVTSE9MRF9NSUxELCBuYW1lPSJUaHJlc2hvbGQ6IE1pbGQgQ2hhbmdlIG9mIFBQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJibHVlIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgIyBhZGRfc2VnbWVudHMoeD0iIzAyIiwgeGVuZD0iIzIyIiwgeSA9IFRIUkVTSE9MRF9FWFRSRU1FLCB5ZW5kID0gVEhSRVNIT0xEX0VYVFJFTUUsIG5hbWU9IlRocmVzaG9sZDogRXh0cmVtZSBDaGFuZ2Ugb2YgUFAiLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iZGFya3JlZCIsIGRhc2ggPSAnZG90JykpICU+JQogIGxheW91dCh5YXhpcyA9IHlBeGlzLCBiYXJtb2RlID0gJ2dyb3VwJywgdGl0bGU9IkZhaWx1cmUgRHJpdmluZyBcbiBHcm91cD1Db2duaXRpdmUiKQoKaHRtbHRvb2xzOjp0YWdMaXN0KGZpZ19Db2duaXRpdmUpCmBgYAoKCgpgYGB7ciwgd2FybmluZz1GfQpmaWdfTW90b3JpYyA8LSBwbG90X2x5KGNvbWJpbmVkRGZfTW90b3JpYywgeCA9IH5TdWJqZWN0LCB5ID0gflBQX0Rldl8yX1N0cmFpZ2h0LCB0eXBlID0gJ2JhcicsIG5hbWUgPSAnQ29nbml0aXZlIC0gTWVhbiBQUCAoU3RyYWlnaHQpJywgbWFya2VyPUNPTE9SX0NPR05JVElWRSkgJT4lCiAgYWRkX3RyYWNlKHkgPSB+UFBfRGV2XzNfU3RyYWlnaHQsIG5hbWUgPSAnTW90b3JpYyAtIE1lYW4gUFAgKFN0cmFpZ2h0KScsIG1hcmtlcj1DT0xPUl9NT1RPUklDKSAlPiUgCiAgYWRkX3RyYWNlKHkgPSB+UFBfRGV2XzJfVHVybmluZywgbmFtZSA9ICdDb2duaXRpdmUgLSBNZWFuIFBQIChUdXJuaW5nKScsIG1hcmtlcj1DT0xPUl9DT0dOSVRJVkUpICU+JSAKICBhZGRfdHJhY2UoeSA9IH5QUF9EZXZfM19UdXJuaW5nLCBuYW1lID0gJ01vdG9yaWMgLSBNZWFuIFBQIChUdXJuaW5nKScsIG1hcmtlcj1DT0xPUl9NT1RPUklDKSAlPiUgCiAgYWRkX3RyYWNlKHkgPSB+UFBfRGV2LCBuYW1lID0gJ0ZhaWx1cmUgLSBQUCBEZXZpYXRpb24nLCBtYXJrZXI9Q09MT1JfRkFJTFVSRSkgJT4lIAogIGFkZF9zZWdtZW50cyh4PSIjMDUiLCB4ZW5kPSIjMzEiLCB5ID0gVEhSRVNIT0xEX01JTEQsIHllbmQgPSBUSFJFU0hPTERfTUlMRCwgbmFtZT0iVGhyZXNob2xkOiBNaWxkIENoYW5nZSBvZiBQUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iYmx1ZSIsIGRhc2ggPSAnZG90JykpICU+JQogICMgYWRkX3NlZ21lbnRzKHg9IiMwNSIsIHhlbmQ9IiMzMSIsIHkgPSBUSFJFU0hPTERfRVhUUkVNRSwgeWVuZCA9IFRIUkVTSE9MRF9FWFRSRU1FLCBuYW1lPSJUaHJlc2hvbGQ6IEV4dHJlbWUgQ2hhbmdlIG9mIFBQIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9ImRhcmtyZWQiLCBkYXNoID0gJ2RvdCcpKSAlPiUKICBsYXlvdXQoeWF4aXMgPSB5QXhpcywgYmFybW9kZSA9ICdncm91cCcsIHRpdGxlPSJGYWlsdXJlIERyaXZpbmcgXG4gR3JvdXA6IE1vdG9yaWMiKQoKaHRtbHRvb2xzOjp0YWdMaXN0KGZpZ19Nb3RvcmljKQpgYGAKCgpgYGB7cn0KbGlicmFyeShubG1lKQpjb21iaW5lZERmJFN1YmplY3QgPSBhcy5mYWN0b3IoY29tYmluZWREZiRTdWJqZWN0KQpjb21iaW5lZERmJEFjdGl2aXR5ID0gYXMuZmFjdG9yKGNvbWJpbmVkRGYkQWN0aXZpdHkpCmNvbWJpbmVkRGYkUFBfRGV2X0dyb3VwID0gaWZlbHNlKGNvbWJpbmVkRGYkUFBfRGV2ID4gVEhSRVNIT0xEX01JTEQsIDEsIDApCmBgYAoKYGBge3J9Cm1vZGVsID0gbG1lKFBQX0RldiB+IAogICAgICAgICAgICAgIGFicyhQUF9EZXZfMl9TdHJhaWdodCkKICAgICAgICAgICAgICArIGFicyhQUF9EZXZfM19TdHJhaWdodCkKICAgICAgICAgICAgICArIGFicyhQUF9EZXZfMl9UdXJuaW5nKSAKICAgICAgICAgICAgICArIGFicyhQUF9EZXZfM19UdXJuaW5nKQogICAgICAgICAgICAgICsgZmFjdG9yKEFjdGl2aXR5KSwgCiAgICAgICAgICAgIHJhbmRvbT1+MXxTdWJqZWN0LAogICAgICAgICAgICBkYXRhPWNvbWJpbmVkRGYsCiAgICAgICAgICAgIG1ldGhvZD0iUkVNTCIpCgojIGFub3ZhKG1vZGVsKQpzdW1tYXJ5KG1vZGVsKQpwbG90KG1vZGVsKQpgYGAKCgpgYGB7cn0KY29tYmluZWREZiRQUF9EZXYgPC0gTlVMTAoKY29tYmluZWREZiRTdWJqZWN0IDwtIE5VTEwKY29tYmluZWREZiRBY3Rpdml0eV9OTyA8LSBpZmVsc2UoY29tYmluZWREZiRBY3Rpdml0eSA9PSAiTk8iLCAxLCAwKQpjb21iaW5lZERmJEFjdGl2aXR5X0MgPC0gaWZlbHNlKGNvbWJpbmVkRGYkQWN0aXZpdHkgPT0gIkMiLCAxLCAwKQpjb21iaW5lZERmJEFjdGl2aXR5X00gPC0gaWZlbHNlKGNvbWJpbmVkRGYkQWN0aXZpdHkgPT0gIk0iLCAxLCAwKQpjb21iaW5lZERmJEFjdGl2aXR5IDwtIE5VTEwKCmNvbWJpbmVkRGYkQ2xhc3MgPC0gaWZlbHNlKGNvbWJpbmVkRGYkUFBfRGV2X0dyb3VwID09IDEsIFQsIEYpCmNvbWJpbmVkRGYkUFBfRGV2X0dyb3VwIDwtIE5VTEwKYGBgCgpgYGB7cn0KIyBsaWJyYXJ5KG1lZmEpCiMgY29tYmluZWREZiA8LSByZXAoY29tYmluZWREZiwgMTApIApgYGAKCmBgYHtyfQpuX2ZvbGRzIDwtIDMKcGFyYW1zIDwtIHBhcmFtIDwtIGxpc3Qob2JqZWN0aXZlICAgICAgID0gImJpbmFyeTpsb2dpc3RpYyIsIAogICAgICAgICAgICAgICBib29zdGVyICAgICAgICAgID0gImdidHJlZSIsCiAgICAgICAgICAgICAgIGV2YWxfbWV0cmljICAgICAgPSAiYXVjIiwKICAgICAgICAgICAgICAgZXRhICAgICAgICAgICAgICA9IDAuMSwKICAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICA9IDgsCiAgICAgICAgICAgICAgIGFscGhhICAgICAgICAgICAgPSAxLAogICAgICAgICAgICAgICBsYW1iZGEgICAgICAgICAgID0gMCwKICAgICAgICAgICAgICAgZ2FtbWEgICAgICAgICAgICA9IDAuMywKICAgICAgICAgICAgICAgbWluX2NoaWxkX3dlaWdodCA9IDAuMywKICAgICAgICAgICAgICAgc3Vic2FtcGxlICAgICAgICA9IDEsCiAgICAgICAgICAgICAgIGNvbHNhbXBsZV9ieXRyZWUgPSAwLjUpCiAgICAgICAgICAgCiMgWEdCb29zdCBNb2RlbCAgICAgICAgIAp4Z2JfbSA8LSB4Z2IuY3YoICAgcGFyYW1zICAgICAgICAgICAgICAgPSBwYXJhbSwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzLm1hdHJpeChjb21iaW5lZERmICU+JSBzZWxlY3QoLUNsYXNzKSkgLAogICAgICAgICAgICAgICAgICBsYWJlbCA9ICBjb21iaW5lZERmJENsYXNzLAogICAgICAgICAgICAgICAgICBucm91bmRzICAgICAgICAgICAgID0gNTAwLAogICAgICAgICAgICAgICAgICB2ZXJib3NlICAgICAgICAgICAgID0gRiwKICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiAgICAgICAgICA9IFQsCiAgICAgICAgICAgICAgICAgIG1heGltaXplICAgICAgICAgICAgPSBULAogICAgICAgICAgICAgICAgICBuZm9sZCAgICAgICAgICAgICAgID0gbl9mb2xkcywKICAgICAgICAgICAgICAgICAgbWV0cmljcyAgICAgICAgICAgICA9IGMoImF1YyIsICJlcnJvciIpLAogICAgICAgICAgICAgICAgICBlYXJseV9zdG9wcGluZ19yb3VuZHMgPSAxMDAsCiAgICAgICAgICAgICAgICAgIHN0cmF0aWZpZWQgICAgICAgICAgICA9IEYsCiAgICAgICAgICAgICAgICAgIHNjYWxlX3Bvc193ZWlnaHQgICAgICA9IDMuMDUpCgojIHhnYl9tJGV2YWx1YXRpb25fbG9nW3hnYl9tJGJlc3RfaXRlcmF0aW9uLCJ0ZXN0X2F1Y19tZWFuIl0KeGdiX20kZXZhbHVhdGlvbl9sb2dbeGdiX20kYmVzdF9pdGVyYXRpb24sXQoKYGBgCgpgYGB7cn0KbGlicmFyeShwUk9DKQoKIyBpdCA9IHdoaWNoLm1heCh4Z2JfbSRldmFsdWF0aW9uX2xvZyR0ZXN0X2F1Y19tZWFuKQojIGJlc3QuaXRlciA9IHhnYl9tJGV2YWx1YXRpb25fbG9nJGl0ZXJbaXRdCiMgYmVzdC5pdGVyIAoKcGxvdChwUk9DOjpyb2MocmVzcG9uc2UgPSBpZmVsc2UoY29tYmluZWREZiRDbGFzcz09VCwgMSwgMCksCiAgICAgICAgICAgICAgIHByZWRpY3RvciA9IHhnYl9tJHByZWQsCiAgICAgICAgICAgICAgIGxldmVscz1jKDAsIDEpKSwKICAgICBsd2Q9MS41KSAKYGBgCgoKCg==